﻿

#ifndef __TRADELIB_API_H__
#define __TRADELIB_API_H__


#pragma once

#include <stdio.h>
#include <tchar.h>

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS         // 移除对话框中的 MFC 控件支持

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif


#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <string>
#include <stdio.h>
#include <map>
#include <thread>
#include <mutex>
#include <functional>
#include <deque>
#include <queue>
#include <map>
#include <chrono>
#include <algorithm>
#include <condition_variable>
#include <atomic>
using namespace std;


#include <wtypes.h>
#include <tchar.h>  
#include <string.h> 


#ifndef _DECLARE_HANDLE__
#define _DECLARE_HANDLE__
DECLARE_HANDLE(Handle);
#endif //_DECLARE_HANDLE__


#ifndef TRADELIB_EXPORTS
#define USE_EXIST_LOGAPI
#endif //TRADELIB_EXPORTS


#ifdef USE_EXIST_LOGAPI

enum vlog_level {
	VLOG_LEVEL_NOT_SET = -1,
	VLOG_LEVEL_ALL = 0,
	VLOG_LEVEL_TRACE = VLOG_LEVEL_ALL,
	VLOG_LEVEL_DEBUG = 10000,
	VLOG_LEVEL_INFO = 20000, //default
	VLOG_LEVEL_RELEASE = VLOG_LEVEL_INFO,
	VLOG_LEVEL_WARN = 30000,
	VLOG_LEVEL_ERROR = 40000,
	VLOG_LEVEL_CRITICAL = 50000,
	VLOG_LEVEL_FATAL = 60000,
	VLOG_LEVEL_OFF = 70000,
};

#ifndef _LogFileMode
#define _LogFileMode
enum LogFileMode { LogFile_Day, LogFile_Hour };
#endif //_LogFileMode


void log_category_vlog(const char* filename, int line, const char* function, const char* category, int priority, const char* format, ...);

#define log_category_trace(fmt, ...)                                                                    \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_TRACE, fmt, ##__VA_ARGS__);\
    } while(false);
#define log_category_trace2(cat, fmt, ...)                                                              \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_TRACE, fmt, ##__VA_ARGS__); \
    } while(false);

#define log_category_debug(fmt, ...)                                                                    \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__);\
    } while(false);
#define log_category_debug2(cat, fmt, ...)                                                              \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__); \
    } while(false);

#define log_category_info(fmt, ...)                                                                     \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_INFO, fmt, ##__VA_ARGS__); \
    } while(false);
#define log_category_info2(cat, fmt, ...)                                                               \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_INFO, fmt, ##__VA_ARGS__);  \
    } while(false);

#define log_category_warning(fmt, ...)                                                                  \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_WARN, fmt, ##__VA_ARGS__); \
    } while(false);
#define log_category_warning2(cat, fmt, ...)                                                            \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_WARN, fmt, ##__VA_ARGS__);  \
    } while(false);

#define log_category_error(fmt, ...)                                                                    \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_ERROR, fmt, ##__VA_ARGS__);\
    } while(false);
#define log_category_error2(cat, fmt, ...)                                                              \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_ERROR, fmt, ##__VA_ARGS__); \
    } while(false);

#define log_category_critical(fmt, ...)                                                                 \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_CRITICAL, fmt, ##__VA_ARGS__); \
    } while(false);
#define log_category_critical2(cat, fmt, ...)                                                           \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_CRITICAL, fmt, ##__VA_ARGS__); \
    } while(false);

#define log_category_fatal(fmt, ...)                                                                    \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, NULL, VLOG_LEVEL_FATAL, fmt, ##__VA_ARGS__);\
    } while(false);
#define log_category_fatal2(cat, fmt, ...)                                                              \
    do {                                                                                                \
        log_category_vlog(__FILE__, __LINE__, __FUNCTION__, cat, VLOG_LEVEL_FATAL, fmt, ##__VA_ARGS__); \
    } while(false);


#define log_trace(fmt, ...)             log_category_trace(fmt, ##__VA_ARGS__)
#define log_debug(fmt, ...)             log_category_debug(fmt, ##__VA_ARGS__)
#define log_info(fmt, ...)              log_category_info(fmt, ##__VA_ARGS__)
#define log_warning(fmt, ...)           log_category_warning(fmt, ##__VA_ARGS__)
#define log_error(fmt, ...)             log_category_error(fmt, ##__VA_ARGS__)
#define log_critical(fmt, ...)          log_category_critical(fmt, ##__VA_ARGS__)
#define log_fatal(fmt, ...)             log_category_fatal(fmt, ##__VA_ARGS__)

#define log_trace2(cat, fmt, ...)       log_category_trace2(cat, fmt, ##__VA_ARGS__)
#define log_debug2(cat, fmt, ...)       log_category_debug2(cat, fmt, ##__VA_ARGS__)
#define log_info2(cat, fmt, ...)        log_category_info2(cat, fmt, ##__VA_ARGS__)
#define log_warning2(cat, fmt, ...)     log_category_warning2(cat, fmt, ##__VA_ARGS__)
#define log_error2(cat, fmt, ...)       log_category_error2(cat, fmt, ##__VA_ARGS__)
#define log_critical2(cat, fmt, ...)    log_category_critical2(cat, fmt, ##__VA_ARGS__)
#define log_fatal2(cat, fmt, ...)       log_category_fatal2(cat, fmt, ##__VA_ARGS__)

#define LogTrace						log_trace
#define LogDebug						log_debug
#define LogInfo							log_info
#define LogWarning						log_warning
#define LogError						log_error
#define LogCritical						log_critical
#define LogFatal						log_fatal

#endif //USE_EXIST_LOGAPI


#if __cplusplus
extern "C" {
#endif //__cplusplus


	//同花顺PC端支持的券商
	enum eBrokerType
	{
		eBrokerTypeCommon = 0,			//通用券商
		eChangChengZhengQuan,			//长城证券
		eZhongXinZhengQuan,				//中信证券
		eChangJiangZhengQuan,			//长江证券
		eZhongXinJianTou,				//中信建投
		eGuoJinZhengQuan,				//国金证券
		eGuoLianZhengQuan,				//国联证券
		eGuoShengZhengQuan,				//国盛证券
		eDongFangZhengQuan,				//东方证券
		ePingAnZhengQuan,				//平安证券
		eChuanCaiZhengQuan,				//川财证券

	};


	//股票持仓信息
	typedef struct STChiCangInfo
	{
		float			total_assets;		//参考总资产
		float			total_profit;		//持仓盈亏(当前持仓股票的总盈亏)
		float			toady_profit;		//当日盈亏(当日所有持仓股票的总盈亏)
		float			today_profit_percent;//当日盈亏比
		float			total_moneys;		//总 资 金
		float			total_mkvalue;		//总 市 值
		float			freeze_moneys;		//冻结资金
		float			total_available;	//可用资金
		float			avail_takeout;		//可取资金，即可以转出到银行卡的资金

		int				stock_quantity;		//持仓股票数

	} STChiCangInfo;

	//持仓股票信息
	typedef struct STStockInfo
	{
		char			stockCode[10];		//股票代码
		char			stockName[20];		//股票名称
		float			stockValue;			//股票市值
		float			stockProfit;		//股票盈亏
		uint32_t		stockQuantity;		//持仓总数
		uint32_t		todayAvailable;		//持仓可用
		float			costPrice;			//成本均价
		float			marketPrice;		//当前市价
		float			todayProfit;		//当日盈亏
		float			posPercentage;		//当前仓位

		char			stockAccount[32];	//股东账户

	} STStockInfo;


	//尚未成交的买入单/卖出单信息
	typedef struct STOrderInfo
	{
		char			stockCode[10];		//股票代码
		char			stockName[20];		//股票名称
		char			comments[20];		//备   注
		uint32_t		entrustQuantity;	//委托数量
		uint32_t		strikeQuantity;		//成交数量
		float			entrustPrice;		//委托价格
		float			strikecostPrice;	//成交均价
		char			operation[20];		//委托操作/买入或卖出
		char			entrustTime[20];	//委托时间
		char			entrustDate[20];	//委托日期
		char			contractNO[20];		//合同编号
		char			tradingMarket[20];	//交易市场
		char			stockAccount[20];	//股东账户
		char			entrustDetails[20];	//详细内容

	} STOrderInfo;


	//日志输出回调
	typedef void (CALLBACK* LOGCBPROC)(LPARAM lParam, uint64_t thread_id, const char* category, int priority, const char* full_log_line);

	//解析股票持仓信息完成回调
	typedef void (CALLBACK* ParseChicangCBProc)(LPARAM lParam, int errcode, const char* errmsg);
	//解析股票撤单信息完成回调
	typedef void (CALLBACK* ParseOrdersCBProc)(LPARAM lParam, int errcode, const char* errmsg);

	typedef struct TradeInitParam
	{
		enum eBrokerType	type;					//券商类型

		LPARAM				lParam;					//回调参数
		LOGCBPROC			logcb;					//日志输出回调
		ParseChicangCBProc	parseChicangCB;			//股票持仓回调
		ParseOrdersCBProc	parseOrdersCB;			//股票撤单回调

	} TradeInitParam;


	//初始化 / 反初始化
	int WINAPI TApi_isInitialized();
	int WINAPI TApi_initialize(enum eBrokerType type);
	int WINAPI TApi_initializeEx(struct TradeInitParam* initParam);
	int WINAPI TApi_release();

	//重新初始化
	int WINAPI TApi_reInitialize();


	//设置日志回调
	void WINAPI TApi_log_set_callback(LOGCBPROC proc, LPARAM lParam);

	//日志输出
	void WINAPI TApi_log_category_log(uint64_t process_id,
		uint64_t thread_id,
		const char* filename,
		int line,
		const char* function,
		const char* category,
		int priority,
		const char* format,
		va_list argp);


	//获取当前账户持仓信息
	int WINAPI TApi_getChiCangInfo(struct STChiCangInfo* info);

	//获取当前账户持仓股票信息
	int WINAPI TApi_getStockCount();
	int WINAPI TApi_getStockInfo(int index, struct STStockInfo* info);



	//下单买入股票：股票代码、股票价格、股票数量，数量必须是100的整数倍
	int WINAPI TApi_stockBuyin(const CHAR* szCode, const CHAR* szPrice, uint32_t count);


	//下单卖出股票：股票代码、股票价格、股票数量，数量必须是100的整数倍
	int WINAPI TApi_stockSellout(const CHAR* szCode, const CHAR* szPrice, uint32_t count);



	//获取当前账户等待成交的股票交易订单
	int WINAPI TApi_getOrderCount();
	int WINAPI TApi_getOrderInfo(int index, struct STOrderInfo* info);


	//撤销指定委托(包含买入单和卖出单)
	int WINAPI TApi_cancelOrder(const char* szOrderNO, const char* stockCode);


	//撤销所有尚未成交的买入单
	int WINAPI TApi_cancelAllBuyin();


	//撤销所有尚未成交的卖出单
	int WINAPI TApi_cancelAllSellout();


	//撤销所有尚未成交的买入单和卖出单
	int WINAPI TApi_cancelAllOrders();







#if __cplusplus
}
#endif //__cplusplus




#endif	//__TRADELIB_API_H__

